package com.cskaoyan.day7._04_treemap;

import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

/**
 * @author Common-zhou
 * @since 2023-03-06 10:55
 */
public class Demo2 {
    public static void main(String[] args) {
        //TreeMap()
        //使用键的自然顺序构造一个新的、空的树映射。
        //TreeMap(Comparator<? super K> comparator)
        //构造一个新的、空的树映射，该映射根据给定比较器进行排序。
        //TreeMap(Map<? extends K,? extends V> m)
        //构造一个与给定映射具有相同映射关系的新的树映射，该映射根据其键的自然顺序 进行排序。
        //TreeMap(SortedMap<K,? extends V> m)
        //构造一个与指定有序映射具有相同映射关系和相同排序顺序的新的树映射。

        //test1();

        //test2();

        //test3();

        test4();

        test5();

    }

    private static void test5() {

        // 现在存的是user作为key。
        Map<User, String> map = new HashMap<>();
        map.put(new User("aaa", 18), "a的value");
        map.put(new User("ccc", 19), "c的value");
        map.put(new User("bbb", 20), "n的value");

        // 会报错 因为既没有实现Comparable接口；也没用传入Comparator
        //TreeMap<User, String> map1 = new TreeMap<>(map);

    }

    private static void test4() {
        //TreeMap(SortedMap<K,? extends V> m)
        //构造一个与指定有序映射具有相同映射关系和相同排序顺序的新的树映射。
        // 不仅拷贝数据，还拷贝排序规则

        TreeMap<User, String> treeMap = new TreeMap<>(new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                // 先按name排； 如果相同，再按age拍
                int compareTo = o1.name.compareTo(o2.name);
                // 如果compareTo 等于0； 我就使用age的值；  如果不等于0  我就使用compareTo
                compareTo = compareTo == 0 ? o1.age - o2.age : compareTo;

                return compareTo;
            }
        });
        treeMap.put(new User("aaa", 18), "a的value");
        treeMap.put(new User("ccc", 19), "c的value");
        treeMap.put(new User("bbb", 20), "n的value");
        //  aaa  bbb  ccc

        TreeMap<User, String> treeMap1 = new TreeMap<>(treeMap);
        // 1.TreeMap里现在有哪些数据？
        // 2.能不能放数据进去

        // 不仅拷贝了数据，还拷贝了排序规则

        //{User{name='aaa', age=18}=a的value, User{name='bbb', age=20}=n的value, User{name='ccc', age=19}=c的value}
        System.out.println(treeMap1);

        // 可以放进去数据
        // abc在第二个
        treeMap1.put(new User("abc", 10), "abc的值");
        System.out.println(treeMap1);


    }

    private static void test3() {
        //TreeMap(Map<? extends K,? extends V> m)
        //构造一个与给定映射具有相同映射关系的新的树映射，该映射根据其键的自然顺序 进行排序。

        Map<String, String> map = new HashMap<>();
        map.put("aa", "aa的值");
        map.put("cc", "cc的值");
        map.put("bb", "bb的值");

        TreeMap<String, String> treeMap = new TreeMap<>(map);
        // 会不会报错？ String 必须要能比较大小
        // String可以比较大小。所以不会报错

        // 2.TreeMap中的数据是什么
        //{aa=aa的值, bb=bb的值, cc=cc的值}
        System.out.println(treeMap);


    }

    /**
     * 如果使用自己的类，来当做TreeMap的key。
     * 有两个可行的路径：
     * 1.实现Comparable接口，
     * 2.传入Comparator接口的实现
     */
    private static void test2() {
        TreeMap<User, String> treeMap1 = new TreeMap<>(new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                // 先按name排； 如果相同，再按age拍
                int compareTo = o1.name.compareTo(o2.name);
                // 如果compareTo 等于0； 我就使用age的值；  如果不等于0  我就使用compareTo
                compareTo = compareTo == 0 ? o1.age - o2.age : compareTo;

                return compareTo;
            }
        });
        treeMap1.put(new User("aaa", 18), "a的value");
        treeMap1.put(new User("ccc", 19), "c的value");
        treeMap1.put(new User("bbb", 20), "n的value");

        System.out.println(treeMap1);
    }

    /**
     * 无参构造方法
     */
    private static void test1() {
        TreeMap<Integer, String> treeMap = new TreeMap<>();
        treeMap.put(1, "一");
        treeMap.put(9, "九");
        treeMap.put(3, "三");

        System.out.println(treeMap);

        //TreeMap<>

        // 如果是无参的构造方法；我们的key必须要实现Comparable接口
        // 否则会 报错
        TreeMap<User, String> treeMap1 = new TreeMap<>();
        treeMap1.put(new User("aaa", 18), "a的value");
        treeMap1.put(new User("ccc", 19), "c的value");
        treeMap1.put(new User("bbb", 20), "n的value");

        //{User{name='aaa', age=18}=a的value, User{name='bbb', age=20}=n的value, User{name='ccc', age=19}=c的value}
        System.out.println(treeMap1);
    }
}


//class User implements Comparable<User> {
//    String name;
//    Integer age;
//
//    public User(String name, Integer age) {
//        this.name = name;
//        this.age = age;
//    }
//
//    @Override
//    public String toString() {
//        return "User{" +
//            "name='" + name + '\'' +
//            ", age=" + age +
//            '}';
//    }
//
//    @Override
//    public int compareTo(User o) {
//
//        // 先按name排； 如果相同，再按age拍
//        int compareTo = this.name.compareTo(o.name);
//        // 如果compareTo 等于0； 我就使用age的值；  如果不等于0  我就使用compareTo
//        compareTo = compareTo == 0 ? this.age - o.age : compareTo;
//
//        return compareTo;
//    }
//}


class User {
    String name;
    Integer age;

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" + "name='" + name + '\'' + ", age=" + age + '}';
    }

}
